package com.mars.admin.modules.post.service;

import com.mars.admin.modules.base.service.BaseService;
import com.mars.admin.modules.post.entity.Post;
import com.mars.admin.modules.post.dto.PostWithUserDTO;
import com.mars.admin.modules.post.vo.PostInfoVO;
import com.mybatisflex.core.paginate.Page;

import java.util.List;

/**
 * 帖子服务接口
 *
 * @author Mars
 * @version 1.0
 * @date 2025-01-07
 */
public interface IPostService extends BaseService<Post> {

    /**
     * 发布帖子
     *
     * @param post     帖子信息
     * @param topicIds 关联话题ID列表
     * @return 是否成功
     */
    boolean publishPost(Post post, List<Long> topicIds);

    /**
     * 更新帖子
     *
     * @param post     帖子信息
     * @param topicIds 关联话题ID列表
     * @return 是否成功
     */
    boolean updatePost(Post post, List<Long> topicIds);

    /**
     * 删除帖子
     *
     * @param postId 帖子ID
     * @return 是否成功
     */
    boolean deletePost(Long postId);

    /**
     * 根据用户ID查询帖子列表
     *
     * @param userId 用户ID
     * @param page   分页参数
     * @return 帖子列表
     */
    Page<Post> getPostsByUserId(Long userId, Page<Post> page);

    /**
     * 根据话题ID查询帖子列表
     *
     * @param topicId 话题ID
     * @param page    分页参数
     * @return 帖子列表
     */
    Page<Post> getPostsByTopicId(Long topicId, Page<Post> page);

    /**
     * 查询热门帖子
     *
     * @param page 分页参数
     * @return 热门帖子列表
     */
    Page<Post> getHotPosts(Page<Post> page);

    /**
     * 查询推荐帖子
     *
     * @param page 分页参数
     * @return 推荐帖子列表
     */
    Page<Post> getRecommendPosts(Page<Post> page);

    /**
     * 根据关注用户查询动态
     *
     * @param userId 当前用户ID
     * @param page   分页参数
     * @return 关注用户的帖子列表
     */
    Page<Post> getFollowingPosts(Long userId, Page<Post> page);

    /**
     * 根据地区查询帖子
     *
     * @param regionId 地区ID
     * @param page     分页参数
     * @return 帖子列表
     */
    Page<Post> getPostsByRegion(Long regionId, Page<Post> page);

    /**
     * 搜索帖子
     *
     * @param keyword 关键词
     * @param page    分页参数
     * @return 帖子列表
     */
    Page<Post> searchPosts(String keyword, Page<Post> page);

    /**
     * 查询用户收藏的帖子
     *
     * @param userId 用户ID
     * @param page   分页参数
     * @return 收藏的帖子列表
     */
    Page<Post> getCollectedPosts(Long userId, Page<Post> page);

    /**
     * 查询用户点赞的帖子
     *
     * @param userId 用户ID
     * @param page   分页参数
     * @return 点赞的帖子列表
     */
    Page<Post> getLikedPosts(Long userId, Page<Post> page);

    /**
     * 查询待审核的帖子
     *
     * @param page 分页参数
     * @return 待审核帖子列表
     */
    Page<Post> getPendingAuditPosts(Page<Post> page);

    /**
     * 审核帖子
     *
     * @param postId      帖子ID
     * @param auditStatus 审核状态
     * @param auditReason 审核原因
     * @param auditUserId 审核人ID
     * @return 是否成功
     */
    boolean auditPost(Long postId, Integer auditStatus, String auditReason, Long auditUserId);

    /**
     * 点赞帖子
     *
     * @param postId 帖子ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean likePost(Long postId, Long userId);

    /**
     * 取消点赞帖子
     *
     * @param postId 帖子ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean unlikePost(Long postId, Long userId);

    /**
     * 收藏帖子
     *
     * @param postId 帖子ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean collectPost(Long postId, Long userId);

    /**
     * 取消收藏帖子
     *
     * @param postId 帖子ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean uncollectPost(Long postId, Long userId);

    /**
     * 分享帖子
     *
     * @param postId   帖子ID
     * @param userId   用户ID
     * @param platform 分享平台
     * @param content  分享内容
     * @param shareIp  分享IP
     * @return 是否成功
     */
    boolean sharePost(Long postId, Long userId, Integer platform, String content, String shareIp);

    /**
     * 记录帖子浏览
     *
     * @param postId    帖子ID
     * @param userId    用户ID（可为空）
     * @param visitorIp 访客IP
     * @param userAgent 用户代理
     * @param referer   来源页面
     * @return 是否成功
     */
    boolean recordPostView(Long postId, Long userId, String visitorIp, String userAgent, String referer);

    /**
     * 设置帖子置顶状态
     *
     * @param postId 帖子ID
     * @param isTop  是否置顶
     * @return 是否成功
     */
    boolean setPostTop(Long postId, Integer isTop);

    /**
     * 设置帖子热门状态
     *
     * @param postId 帖子ID
     * @param isHot  是否热门
     * @return 是否成功
     */
    boolean setPostHot(Long postId, Integer isHot);

    /**
     * 设置帖子推荐状态
     *
     * @param postId      帖子ID
     * @param isRecommend 是否推荐
     * @return 是否成功
     */
    boolean setPostRecommend(Long postId, Integer isRecommend);

    /**
     * 分页查询帖子列表（关联用户信息）
     *
     * @param page        分页参数
     * @param userId      用户ID（可选）
     * @param topicId     话题ID（可选）
     * @param postType    帖子类型（可选）
     * @param isHot       是否热门（可选）
     * @param isRecommend 是否推荐（可选）
     * @param status      状态（可选）
     * @param auditStatus 审核状态（可选）
     * @param keyword  关键词（可选）
     * @return 帖子列表（包含用户信息）
     */
    Page<PostInfoVO> getPostListWithUser(Page<PostInfoVO> page,
            Long userId,
            Long topicId,
            Integer postType,
            Integer isHot,
            Integer isRecommend,
            Integer status,
            Integer auditStatus, String keyword);

    PostInfoVO getDetail(Long id);
}